//
//  ViewController.m
//  26_GCD
//
//  Created by 徐昊 on 16/8/18.
//  Copyright © 2016年 徐昊. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    // 1. GCD Grand(伟大的) Centeral(中央的) Dispatch(调度)
    // 2. GCD的核心概念 队列, 任务拆分分配到队列中, 系统会自动为我们创建线程和调度线程
    // 3. GCD中的队列严格遵循FIFO(先进先出)原则
    //    队列分类
    //    1. 串行 DISPATCH_QUEUE_SERIAL / NULL
    //    2. 并发 DISPATCH_QUEUE_CONCURRENT
    // 4. 队列的创建
    //    1> 队列名字
    //    2> 队列类型
    // 串行
    dispatch_queue_t serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL);
    // 并发
    dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
    // 主队列 串行
    dispatch_queue_t mainQueue = dispatch_get_main_queue();
    // 全局队列, 并发
    // 参数1: 调度队列优先级
    // 参数2: 给未来使用, 占位使用, 填0
    dispatch_queue_t global = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    // 术语:
    // 串行, 一个任务执行完毕, 再执行下一个
    // 并发, 多个任务同时执行
    // 5. 同步 异步
    // 同步 在当前线程执行任务, 不能开辟线程
    // 异步 在新的线程执行任务, 可以开辟线程
    // 1> 同步
//    [self syncSerialQueue:serialQueue];
//    [self syncConcurrentQueue:concurrentQueue];
    // 同步主线程队列
    // 主线程 同步 主线程
    // 主线程等待同步操作结束, 同步操作在主线程执行, 互相等待, 导致程序卡死
//    [self syncMainQueue:mainQueue];
//    [self syncGlobelQueue:global];
    
    // 2> 异步
//    [self asyncSerialQueue:serialQueue];
//    [self asyncConcurrentQueue:concurrentQueue];
//    [self asyncMainQueue:mainQueue];
//    [self asyncGlobelQueue:global];
    
    // 6. group
    // 组中只有异步
    // 组中添加多个任务时
    dispatch_group_t group = dispatch_group_create();
    dispatch_queue_t queue = dispatch_queue_create("xuhao", DISPATCH_QUEUE_CONCURRENT);
    dispatch_group_async(group, queue, ^{
        NSLog(@"group -- %@", [NSThread currentThread]);
        
    });
    dispatch_group_async(group, queue, ^{
        NSLog(@"group2 -- %@", [NSThread currentThread]);
        
    });
    dispatch_group_async(group, queue, ^{
        NSLog(@"group3 -- %@", [NSThread currentThread]);
        
    });
    // 素有任务都执行完毕, 会调用下列方法
    dispatch_group_notify(group, queue, ^{
        
        NSLog(@"所有操作完成");
    });
}
- (void)syncSerialQueue:(dispatch_queue_t)serialQueue {
    // 同步串行队列 不会创建线程
    for (int i = 0; i < 10; i++) {
        dispatch_sync(serialQueue, ^{
            NSLog(@"%d -- %@", i, [NSThread currentThread]);
        });
    }
}
- (void)syncConcurrentQueue:(dispatch_queue_t)concurrentQueue {
    // 同步并发队列 不会创建线程
    for (int i = 0; i < 10; i++) {
        dispatch_sync(concurrentQueue, ^{
            NSLog(@"%d -- %@", i, [NSThread currentThread]);
        });
    }
}
- (void)syncMainQueue:(dispatch_queue_t)mainQueue {
    for (int i = 0; i < 10; i++) {
        dispatch_sync(mainQueue, ^{
            NSLog(@"%d -- %@", i, [NSThread currentThread]);
        });
    }
}
- (void)syncGlobelQueue:(dispatch_queue_t)globelQueue {
    for (int i = 0; i < 10; i++) {
        dispatch_sync(globelQueue, ^{
            NSLog(@"%d -- %@", i, [NSThread currentThread]);
        });
    }
}

- (void)asyncSerialQueue:(dispatch_queue_t)serialQueue {
    // 异步串行队列 创建一个线程 并且在此线程中完成所有任务
    for (int i = 0; i < 10; i++) {
        dispatch_async(serialQueue, ^{
            NSLog(@"%d -- %@", i, [NSThread currentThread]);
        });
    }
}
- (void)asyncConcurrentQueue:(dispatch_queue_t)concurrentQueue {
    // 异步并发队列 根据任务决定需要创建多少线程
    for (int i = 0; i < 10; i++) {
        dispatch_async(concurrentQueue, ^{
            NSLog(@"%d -- %@", i, [NSThread currentThread]);
        });
    }
}
- (void)asyncMainQueue:(dispatch_queue_t)mainQueue {
    for (int i = 0; i < 10; i++) {
        dispatch_async(mainQueue, ^{
            NSLog(@"%d -- %@", i, [NSThread currentThread]);
        });
    }
}
- (void)asyncGlobelQueue:(dispatch_queue_t)globelQueue {
    for (int i = 0; i < 10; i++) {
        dispatch_async(globelQueue, ^{
            NSLog(@"%d -- %@", i, [NSThread currentThread]);
        });
    }
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


@end
